/**
 * @file config_manager.h
 * @brief 基于cJSON的配置管理器
 * @details 提供JSON配置文件的加载、解析、查询和修改功能
 * @author 开发者
 * @date 2024
 * @version 1.0.0
 */

#ifndef CONFIG_MANAGER_H
#define CONFIG_MANAGER_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>
#include "../../third_party/cJSON/cJSON.h"

/**
 * @brief 配置管理器结构体
 * @details 存储配置管理器的状态和加载的JSON配置对象
 */
typedef struct {
    char *config_dir;              /**< 配置目录路径 */
    cJSON *device_config;          /**< 设备配置JSON对象 */
    cJSON *thing_model;            /**< 物模型JSON对象 */
    cJSON *message_templates;      /**< 消息模板JSON对象 */
    bool initialized;              /**< 初始化状态标志 */
} config_manager_t;

// 函数声明

/**
 * @brief 初始化配置管理器
 * @param manager 配置管理器
 * @param config_dir 配置目录
 * @return 成功返回0，失败返回-1
 */
int config_manager_init(config_manager_t *manager, const char *config_dir);

/**
 * @brief 清理配置管理器
 * @param manager 配置管理器
 */
void config_manager_cleanup(config_manager_t *manager);

/**
 * @brief 加载配置文件
 * @param manager 配置管理器
 * @param filename 文件名
 * @return 成功返回cJSON对象，失败返回NULL
 */
cJSON* config_manager_load_file(config_manager_t *manager, const char *filename);

/**
 * @brief 保存配置文件
 * @param manager 配置管理器
 * @param json cJSON对象
 * @param filename 文件名
 * @return 成功返回0，失败返回-1
 */
int config_manager_save_file(config_manager_t *manager, cJSON *json, const char *filename);

/**
 * @brief 获取字符串配置值
 * @param json cJSON对象
 * @param key 配置键
 * @param default_value 默认值
 * @return 配置值
 */
const char* config_get_string(cJSON *json, const char *key, const char *default_value);

/**
 * @brief 获取整数配置值
 * @param json cJSON对象
 * @param key 配置键
 * @param default_value 默认值
 * @return 配置值
 */
int config_get_int(cJSON *json, const char *key, int default_value);

/**
 * @brief 获取布尔配置值
 * @param json cJSON对象
 * @param key 配置键
 * @param default_value 默认值
 * @return 配置值
 */
bool config_get_bool(cJSON *json, const char *key, bool default_value);

/**
 * @brief 获取浮点数配置值
 * @param json cJSON对象
 * @param key 配置键
 * @param default_value 默认值
 * @return 配置值
 */
double config_get_double(cJSON *json, const char *key, double default_value);

/**
 * @brief 获取嵌套配置值
 * @param json cJSON对象
 * @param path 配置路径，如 "device.productKey"
 * @param default_value 默认值
 * @return 配置值
 */
const char* config_get_nested_string(cJSON *json, const char *path, const char *default_value);

/**
 * @brief 设置字符串配置值
 * @param json cJSON对象
 * @param key 配置键
 * @param value 配置值
 * @return 成功返回0，失败返回-1
 */
int config_set_string(cJSON *json, const char *key, const char *value);

/**
 * @brief 设置整数配置值
 * @param json cJSON对象
 * @param key 配置键
 * @param value 配置值
 * @return 成功返回0，失败返回-1
 */
int config_set_int(cJSON *json, const char *key, int value);

/**
 * @brief 设置布尔配置值
 * @param json cJSON对象
 * @param key 配置键
 * @param value 配置值
 * @return 成功返回0，失败返回-1
 */
int config_set_bool(cJSON *json, const char *key, bool value);

/**
 * @brief 设置嵌套配置值
 * @param json cJSON对象
 * @param path 配置路径
 * @param value 配置值
 * @return 成功返回0，失败返回-1
 */
int config_set_nested_string(cJSON *json, const char *path, const char *value);

/**
 * @brief 检查配置项是否存在
 * @param json cJSON对象
 * @param key 配置键
 * @return 存在返回true，不存在返回false
 */
bool config_has_key(cJSON *json, const char *key);

/**
 * @brief 获取数组大小
 * @param json cJSON数组对象
 * @return 数组大小
 */
int config_get_array_size(cJSON *json);

/**
 * @brief 获取数组元素
 * @param json cJSON数组对象
 * @param index 索引
 * @return cJSON对象，失败返回NULL
 */
cJSON* config_get_array_item(cJSON *json, int index);

/**
 * @brief 添加数组元素
 * @param json cJSON数组对象
 * @param item 要添加的元素
 * @return 成功返回0，失败返回-1
 */
int config_add_array_item(cJSON *json, cJSON *item);

/**
 * @brief 创建消息模板
 * @param template_name 模板名称
 * @param variables 变量数组
 * @param variable_count 变量数量
 * @return 成功返回cJSON对象，失败返回NULL
 */
cJSON* config_create_message_template(const char *template_name, const char **variables, int variable_count);

/**
 * @brief 填充消息模板
 * @param template_json 模板cJSON对象
 * @param values 值数组
 * @param value_count 值数量
 * @return 成功返回填充后的cJSON对象，失败返回NULL
 */
cJSON* config_fill_message_template(cJSON *template_json, const char **values, int value_count);

/**
 * @brief 验证配置完整性
 * @param json cJSON对象
 * @param required_keys 必需键数组
 * @param key_count 键数量
 * @return 成功返回0，失败返回-1
 */
int config_validate(cJSON *json, const char **required_keys, int key_count);

/**
 * @brief 打印配置内容
 * @param json cJSON对象
 * @param title 标题
 */
void config_print(cJSON *json, const char *title);

#endif // CONFIG_MANAGER_H
